package com.priox.sigar.application.cuentacontable;

import com.googlecode.ehcache.annotations.Cacheable;
import com.mm.support.mapper.DTOMapperService;
import com.priox.sigar.application.mappers.CheckPointMapper;
import com.priox.sigar.application.mappers.CuentaContableMapper;
import com.priox.sigar.client.dto.CuentaContableDTO;
import com.priox.sigar.client.flt.CuentaContableFlt;
import com.priox.sigar.domain.model.CuentaContable;
import com.priox.sigar.domain.model.CuentaContableRepository;
import com.priox.sigar.enums.TipoVisible;
import com.priox.sigar.server.infrastructure.persistence.exception.ApplicationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Component
public class RegistroCuentaContableAppImpl implements RegistroCuentaContableApp {

    @Autowired
    DTOMapperService mapperService;

    @Autowired
    CuentaContableRepository cuentaContableRepository;

    @Autowired
    CuentaContableMapper cuentaContableMapper;

    @Autowired
    CheckPointMapper checkPointMapper;


    public List<CuentaContableDTO> findByCuentaUsuarioId(CuentaContableFlt cuentaContableFlt){
        return cuentaContableMapper.findByCuentaUsuarioId(cuentaContableFlt);
    }


    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void save(CuentaContable cuentaContable, boolean updateMode) {
        if (cuentaContable.getOpcion() == null) {
            cuentaContable.setOpcion(TipoVisible.VISIBLE);
        }
        if (updateMode) {
            cuentaContableRepository.merge(cuentaContable);
        } else {
            int cont = cuentaContableMapper.existeCuentaId(cuentaContable.getCuentaContableId());
            if (cont > 0) {
                throw new ApplicationException("La cuenta '" + cuentaContable.getCuentaContableId() + "' ya esta registrada");
            }
            cuentaContableRepository.persist(cuentaContable);
        }
    }
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void deleteAll() {
        cuentaContableMapper.deleteAll();
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveOrUpdate(Long checkPointId,CuentaContable cuentaContable) {
        if (cuentaContable.getOpcion() == null) {
            cuentaContable.setOpcion(TipoVisible.OCULTO);
        }

        int cont = cuentaContableMapper.existeCuentaId(cuentaContable.getCuentaContableId());
        if (cont>0) {
            cuentaContableRepository.merge(cuentaContable);
        } else {
            cuentaContableRepository.persist(cuentaContable);
        }

    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void delete(CuentaContable cuentaContable) {
        cuentaContableRepository.remove(cuentaContable);
        cuentaContableRepository.flush();
    }
}
